﻿Imports System.IO

Public Class KillerBytesOld
    Inherits SubprogramasComunes
    Private WithEvents _descompresores As New List(Of Descompresor)
    Private ReadOnly _tiposArchivo As New List(Of TipoArchivo)
    Private WithEvents _empaquetador As Empaquetador
    Private WithEvents _compresor As Compresor
    Private _directorioPrincipal As String = ""
    Private Const TamañoTipoConsideradoEnano As Integer = 1024 * 256
    Public Event Verbose(ByVal message As String)

    'Nueva mierda! Multithreading tasks!
    'Dim procesor As New NuevoProcesador
    '    procesor.Executable = New ExecutableSearcher("rar.exe", {"C:\Program Files\WinRar", "C:\Program Files (x86)\WinRar"})
    '    procesor.Start()


    Private Sub Inicializa()
        Dim descompresorWinRar As New Descompresor("WinRar Decompressor", "UnRAR.exe", {"C:\Program Files\WinRAR", "C:\Program Files (x86)\WinRAR"})
        descompresorWinRar.NuevoTipoArchivoAdmitido(".rar")
        descompresorWinRar.Parametro = "%exec% x -y %in% %out%"
        AddHandler descompresorWinRar.Verbose, AddressOf EnviarMensajeAlExterior
        _descompresores.Add(descompresorWinRar)
        RaiseEvent Verbose("Procesador """ & descompresorWinRar.GetNombreCompresor & """ vinculado!")

        Dim _
            descompresorJar As _
                New Descompresor("JAVA JAR Decompressor", "jar.exe", {"C:\Program Files\Java"})
        descompresorJar.NuevoTipoArchivoAdmitido(".jar")
        descompresorJar.Parametro = "cd %out%&%exec% xf %in%"
        AddHandler descompresorJar.Verbose, AddressOf EnviarMensajeAlExterior
        _descompresores.Add(descompresorJar)
        RaiseEvent Verbose("Procesador """ & descompresorJar.GetNombreCompresor & """ vinculado!")

        _empaquetador = New Empaquetador("WinRar Packer", "rar.exe", {"C:\Program Files\WinRAR", "C:\Program Files (x86)\WinRAR"})
        _empaquetador.Parametro = "%exec% a -m0 -r -ep1 %in% %out%"
        AddHandler _empaquetador.Verbose, AddressOf EnviarMensajeAlExterior
        RaiseEvent Verbose("Procesador """ & _empaquetador.GetNombreCompresor & """ vinculado!")

        _compresor = New Compresor("WinRar Compressor", "rar.exe", {"C:\Program Files\WinRAR", "C:\Program Files (x86)\WinRAR"})
        _compresor.Parametro = "%exec% a -m5 %in% %out%"
        AddHandler _compresor.Verbose, AddressOf EnviarMensajeAlExterior
        RaiseEvent Verbose("Procesador """ & _compresor.GetNombreCompresor & """ vinculado!")

    End Sub

    Public Sub KillBytes(ByVal archivo As String)
        Inicializa()
        Descomprime(archivo)
        AnalizaTipos(_directorioPrincipal)
        Empaqueta()
        Comprime()
    End Sub

    Private Sub Comprime()
        _compresor.Comprime(_directorioPrincipal & "Packs")
    End Sub


    Private Sub Descomprime(ByRef archivo As String)
        For Each descompresor In _descompresores
            If descompresor.ComprobarAdmision(GetExtension(archivo)) Then
                Dim directorioSalida As String =
                        String.Format("{0}\TD_{1}_{2}", My.Computer.FileSystem.GetParentPath(archivo),
                                      GetExtension(archivo), GetNombre(archivo))

                If _directorioPrincipal = "" Then _directorioPrincipal = directorioSalida

                descompresor.Descomprime(archivo, directorioSalida)

                For Each fichero In _
                    My.Computer.FileSystem.GetFiles(directorioSalida, FileIO.SearchOption.SearchAllSubDirectories)
                    Descomprime(fichero)
                Next

                Return
            End If
        Next
    End Sub

    Private Sub AnalizaTipos(ByVal directorio As String)
        RaiseEvent Verbose(vbNewLine & "Analizando tipos...")
        Dim triggerNuevoTipo As Boolean = True

        For Each archivo As String In My.Computer.FileSystem.GetFiles(directorio, FileIO.SearchOption.SearchAllSubDirectories)
            For Each tipo As TipoArchivo In _tiposArchivo
                If GetExtension(archivo) = tipo.Tipo Then
                    triggerNuevoTipo = False
                    tipo.NuevoArchivo(archivo)
                    Exit For
                End If

                If _tiposArchivo.IndexOf(tipo) = _tiposArchivo.IndexOf(_tiposArchivo.Last()) Then
                    triggerNuevoTipo = True
                End If
            Next

            If triggerNuevoTipo = True Then
                RaiseEvent Verbose(String.Format("Tipo: {0} registrado.",
                                                      AlinearIzquierda(GetExtension(archivo), 20)))
                Dim nuevoTipo As TipoArchivo = New TipoArchivo(GetExtension(archivo))
                nuevoTipo.NuevoArchivo(archivo)
                _tiposArchivo.Add(nuevoTipo)

                triggerNuevoTipo = False
            End If
        Next

        RaiseEvent Verbose(vbNewLine & "Totales:")
        For Each tipo As TipoArchivo In _tiposArchivo
            RaiseEvent Verbose(String.Format("Tipo {0}: {1} bytes {2} archivos.", AlinearIzquierda(tipo.Tipo, 18),
                                                  AlinearDerecha(tipo.Tamaño.ToString, 12),
                                                  AlinearDerecha(tipo.NumeroArchivos.ToString, 7)))
        Next
    End Sub

    Private Sub Empaqueta()
        MoverArchivosSinExtensionAlFinal()
        For Each tipo As TipoArchivo In _tiposArchivo
            If tipo.Tamaño > TamañoTipoConsideradoEnano Then
                _empaquetador.Empaqueta(_directorioPrincipal, tipo.Tipo, tipo.Tipo)
            Else
                _empaquetador.Empaqueta(_directorioPrincipal, tipo.Tipo, ".trash")
            End If
        Next
        Directory.Delete(_directorioPrincipal, True)
    End Sub

    Private Sub MoverArchivosSinExtensionAlFinal()
        For Each tipo As TipoArchivo In _tiposArchivo
            If _
                tipo.Tipo = "NO-EXTENSION" AndAlso
                _tiposArchivo.IndexOf(tipo) < _tiposArchivo.IndexOf(_tiposArchivo.Last) Then
                Dim temp As TipoArchivo = tipo
                _tiposArchivo.RemoveAt(_tiposArchivo.IndexOf(tipo))
                _tiposArchivo.Add(temp)
                Exit Sub
            End If
        Next
    End Sub

    Private Sub EnviarMensajeAlExterior(ByVal mensaje As String)
        RaiseEvent Verbose(mensaje)
    End Sub

    Public Sub New()

    End Sub
End Class